Ch4. 강제변환
4.1 값 변환
- 타입 캐스팅: 명시적 형변환 (
String(a),Number(b)) - 강제변환(Coercion): 암시적 변환 (
a + "",!!a)
var a = 42;
var b = a + ""; // 암시적
var c = String(a); // 명시적
4.2 추상 연산
4.2.1 ToString
null -> "null"
undefined -> "undefined"
true -> "true"
[1, 2, 3] -> "1,2,3"
{ a: 1 } -> "[object Object]"
JSON.stringify 의 특징:
JSON.stringify([1, undefined, function() {}, 4]); // "[1,null,null,4]"
JSON.stringify({ a: 1, b: undefined }); // "{"a":1}"
toJSON이 있으면 먼저 호출됨.
4.2.2 ToNumber
true -> 1
false -> 0
undefined -> NaN
null -> 0
객체는 valueOf() → toString() 순으로 시도 후 변환:
var a = {
valueOf() { return "28"; }
};
Number(a); // 28
4.2.3 ToBoolean
- falsy:
0,-0,NaN,"",null,undefined,false - truthy: 나머지 전부
document.all은 유일한 falsy 객체 (레거시)
4.3 명시적 강제변환
Number("42"); // 42
String(100); // "100"
Boolean(0); // false
new 키워드는 필요 없음. 사용 지양.
4.4 암시적 강제변환
4.4.2 문자열 ↔ 숫자
"5" * 2; // 10
"5" + 2; // "52"
4.4.5 && 와 ||
var a = 42;
var b = "abc";
var c = null;
a || b; // 42
a && b; // "abc"
c || b; // "abc"
c && b; // null
→ boolean이 아닌 값을 반환하는 선택 연산자처럼 작동
4.4.6 Symbol의 강제변환
var s1 = Symbol("s");
String(s1); // OK
s1 + ""; // TypeError
4.5 동등 비교
==: 느슨한 비교 (타입 강제 변환 발생)===: 엄격한 비교 (타입 비교까지 포함)
0 == "0"; // true
0 === "0"; // false
NaN === NaN: falseObject.is(NaN, NaN): true
4.6 추상 관계 비교
[42] < ["43"]; // true
["43"] < [42]; // false
→ 배열은 문자열로 변환되어 비교됨
4.7 정리
- 명시적 변환은 명확하므로 선호
- 암시적 변환은 JavaScript의 유연함이지만, 혼란을 야기할 수 있음
- JSON.stringify, ToPrimitive 등 추상 연산의 흐름을 이해하자